{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第二步：调整树的参数：max_depth & min_child_weight\n",
    "(粗调，参数的步长为2；下一步是在粗调最佳参数周围，将步长降为1，进行精细调整)\n",
    "接2_1,最好的max_depth=5， min_child_weight = 5。可以在max_depth = [4,5,6]，min_child_weight=[6,7,8]继续搜索。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "# import tool kit\n",
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# read data\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath + 'RentListingInquries_FE_train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "train = train.drop(['interest_level'], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [4, 5, 6], 'min_child_weight': [6, 7, 8]}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = [4, 5, 6]\n",
    "min_child_weight = [6, 7, 8]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59032, std: 0.00421, params: {'max_depth': 4, 'min_child_weight': 6},\n",
       "  mean: -0.58988, std: 0.00399, params: {'max_depth': 4, 'min_child_weight': 7},\n",
       "  mean: -0.59000, std: 0.00418, params: {'max_depth': 4, 'min_child_weight': 8},\n",
       "  mean: -0.58892, std: 0.00372, params: {'max_depth': 5, 'min_child_weight': 6},\n",
       "  mean: -0.58797, std: 0.00400, params: {'max_depth': 5, 'min_child_weight': 7},\n",
       "  mean: -0.58821, std: 0.00430, params: {'max_depth': 5, 'min_child_weight': 8},\n",
       "  mean: -0.58944, std: 0.00371, params: {'max_depth': 6, 'min_child_weight': 6},\n",
       "  mean: -0.58954, std: 0.00387, params: {'max_depth': 6, 'min_child_weight': 7},\n",
       "  mean: -0.58948, std: 0.00427, params: {'max_depth': 6, 'min_child_weight': 8}],\n",
       " {'max_depth': 5, 'min_child_weight': 7},\n",
       " -0.58797394012814108)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_2 = XGBClassifier(learning_rate=0.1, \n",
    "                       n_estimators=314, # 上一轮得出\n",
    "                       max_depth=5, \n",
    "                       min_child_weight=1, \n",
    "                       gamma=0, \n",
    "                       subsample=0.3, \n",
    "                       colsample_bytree=0.8, \n",
    "                       colsample_bylevel=0.7, \n",
    "                       objective= 'multi:softprob',\n",
    "                       seed=3)\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid=param_test2_2, scoring='neg_log_loss', n_jobs=-1, cv=kfold)\n",
    "gsearch2_2.fit(X_train, y_train)\n",
    "\n",
    "gsearch2_2.grid_scores_, gsearch2_2.best_params_,     gsearch2_2.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 197.04068537,  182.29451795,  180.37513108,  222.18230414,\n",
       "         223.66587815,  213.10746193,  258.03916259,  260.64728503,\n",
       "         476.25310407]),\n",
       " 'mean_score_time': array([ 0.90030789,  0.78342967,  0.81884317,  1.08200235,  1.17290564,\n",
       "         1.20621104,  1.48728857,  1.50662923,  1.19068656]),\n",
       " 'mean_test_score': array([-0.59031861, -0.58987687, -0.5900031 , -0.58892413, -0.58797394,\n",
       "        -0.58820764, -0.58944043, -0.58954318, -0.58948012]),\n",
       " 'mean_train_score': array([-0.53613499, -0.53677806, -0.53751304, -0.49993296, -0.50151759,\n",
       "        -0.502936  , -0.45632102, -0.45956741, -0.4624848 ]),\n",
       " 'param_max_depth': masked_array(data = [4 4 4 5 5 5 6 6 6],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'param_min_child_weight': masked_array(data = [6 7 8 6 7 8 6 7 8],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'params': [{'max_depth': 4, 'min_child_weight': 6},\n",
       "  {'max_depth': 4, 'min_child_weight': 7},\n",
       "  {'max_depth': 4, 'min_child_weight': 8},\n",
       "  {'max_depth': 5, 'min_child_weight': 6},\n",
       "  {'max_depth': 5, 'min_child_weight': 7},\n",
       "  {'max_depth': 5, 'min_child_weight': 8},\n",
       "  {'max_depth': 6, 'min_child_weight': 6},\n",
       "  {'max_depth': 6, 'min_child_weight': 7},\n",
       "  {'max_depth': 6, 'min_child_weight': 8}],\n",
       " 'rank_test_score': array([9, 7, 8, 3, 1, 2, 4, 6, 5], dtype=int32),\n",
       " 'split0_test_score': array([-0.58363595, -0.58379807, -0.58366197, -0.58287845, -0.58082893,\n",
       "        -0.58071517, -0.58275719, -0.58246945, -0.58272486]),\n",
       " 'split0_train_score': array([-0.53862477, -0.53813476, -0.53964132, -0.50138511, -0.50304266,\n",
       "        -0.50456509, -0.45879164, -0.46233786, -0.46465173]),\n",
       " 'split1_test_score': array([-0.58823194, -0.58665509, -0.5869837 , -0.5865948 , -0.58701616,\n",
       "        -0.58615221, -0.58960957, -0.59037995, -0.58908816]),\n",
       " 'split1_train_score': array([-0.535275  , -0.53647768, -0.53733483, -0.49986368, -0.50175351,\n",
       "        -0.50341197, -0.45533634, -0.45876641, -0.46240481]),\n",
       " 'split2_test_score': array([-0.59094075, -0.59149258, -0.59078535, -0.59025319, -0.58888432,\n",
       "        -0.59037263, -0.59034682, -0.58946137, -0.58904614]),\n",
       " 'split2_train_score': array([-0.53532314, -0.53711746, -0.53724275, -0.49917934, -0.50076721,\n",
       "        -0.50245084, -0.45676453, -0.45880219, -0.46250476]),\n",
       " 'split3_test_score': array([-0.59264458, -0.59342006, -0.59369616, -0.59192468, -0.59078605,\n",
       "        -0.59166851, -0.59032152, -0.59123541, -0.59040774]),\n",
       " 'split3_train_score': array([-0.53634954, -0.53687743, -0.53724676, -0.50114215, -0.50204225,\n",
       "        -0.50318758, -0.45525716, -0.45906952, -0.46143821]),\n",
       " 'split4_test_score': array([-0.59614162, -0.59401982, -0.59488978, -0.59297076, -0.59235556,\n",
       "        -0.59213086, -0.59416846, -0.59417111, -0.59613572]),\n",
       " 'split4_train_score': array([-0.53510249, -0.535283  , -0.53609953, -0.4980945 , -0.49998233,\n",
       "        -0.50106452, -0.45545541, -0.45886107, -0.46142447]),\n",
       " 'std_fit_time': array([   6.33532627,    3.39115662,    2.11540294,    0.90258991,\n",
       "           5.65174224,    1.29467578,    3.52593959,    6.10163844,\n",
       "         459.65764889]),\n",
       " 'std_score_time': array([ 0.04824342,  0.02713488,  0.05501465,  0.05043627,  0.18599561,\n",
       "         0.25037095,  0.08269893,  0.08256353,  0.32090955]),\n",
       " 'std_test_score': array([ 0.00421217,  0.00399149,  0.00418223,  0.00371807,  0.00399757,\n",
       "         0.00429929,  0.00370524,  0.0038736 ,  0.00426908]),\n",
       " 'std_train_score': array([ 0.00131983,  0.00092641,  0.00115787,  0.00122667,  0.00105611,\n",
       "         0.00115599,  0.00135287,  0.0013892 ,  0.00117661])}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_2.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.587974 using {'max_depth': 5, 'min_child_weight': 7}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nQsgYY4xn/j/YmdVmjly3OgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10a08af98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_2.best_score_, gsearch2_2.best_params_))\n",
    "test_means = gsearch2_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_2.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_2.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_2.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(min_child_weight), len(max_depth))\n",
    "train_scores = np.array(train_means).reshape(len(min_child_weight), len(max_depth))\n",
    "\n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( '- Log Loss' )\n",
    "pyplot.savefig( 'max_depth_vs_min_child_weght2.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个结果不如 参数 'max_depth': 5, 'min_child_weight': 5的表现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
